// rust代码组织
// 模块系统
// package（包）：cargo的特征，让你构建、测试、共享crate
// 包含一个carto.toml，他描述如何构建这些crates，只能包含0-1个library crate，可以包含任意数量的binary crate，但是至少要有一个library或者binary crate
// src/main.rs表示binary crate的crate root，crate名与package名相同
// src/lib.rs表示package包含一个library crate，library crate的crate root，crate名与package名相同
// cargo会把carto root文件交给rustc来构建library或者binary
// 一个package可以同时包含src/main.rs和src/lib.rs，一个binary carte和library carte，名称与package相同，一个package可以有多个binary crate，文件可以放在src/bin每个文件都是单独的binary carte

// carte（单元包）：一个模块树。他可以产生一个library或者可执行文件
// carte有library和binary（二进制）两种类型
// carte Root：源代码文件，rust编译器从这里开始，组成你的carte的跟module
// 将相关的功能组合到一个作用域内，便于在项目间进行共享（还能防止命名冲突）

// module（模块）：user关键字让你可以控制代码的组织、作用域、私有路径
// 在一个crate中将代码进行分组
// 增加可读性，易于复用
// 控制项目的私有性，public、private
// 建立module：mod关键字，可嵌套，可包含其他项（struct、enum、常量、trait、函数等）的定义
// src/main.rs和src/lib.rs叫做carte roots：这两个文件（任意一个）的内容形成了名为carte的模块，位于整个模块树的根部

// path（路径）：为struct、function、module等项命名的方式
// 为了在rust的模块中找到某个条目，需要使用路径。
// 路径的两种形式
// 绝对路径：从crate root开始，使用crate名或者字面值crate
// 相对路径：从当模块开始，使用self，super或者当前模块的标识符
// 路径至少由一个标识符组成，标识符之间使用::
// 例子见lib.rs的eat_at_restaurant
// 私有边界（privacy boundary）
// 模块不仅可以组织代码，还可以定义私有边界。
// 如果想把函数或struct等设为私有,可以将它放在某个某块中
// rust中所有的条目(函数/方法/struct/enum/模块/常量)默认都是私有
// 父级模块不能访问子模块条目，子模块可以访问所有祖先模块的条目
// 使用pub关键字可以将条目设置成公共的条目
// 同一个文件中不用pub也能访问

// super关键字
// 通过super来访问父级模块路径中的内容，类似文件系统中的"cd .."的..

// use关键字将路径导入到作用域（仍然遵循私有性原则）
// 使用use来指定相对路径
// 函数的父级一般指定到父级
// struct，enum一般指定完整路径
// as关键字可以为引入的路径指定本地的别名
// pub use可以对外暴露代码类似js的import和export
// 使用外部包
// 1.cargo.toml添加依赖的包
// 2.https://cargo.io/
// 3.use将特定的条目引入作用域
// 标准库std已内置到rust中了

fn main() {
    println!("hello world");
}
